<?php
/**
 * Classe para validação de Dados da API com algumas modificações.
 *  NÃO SE REIVENTA A RODA.
 * vlw gente!
 * @author Dimitri Lameri, Danilo Gomes <danilo@digirati.com.br>,
 * Arnour Sabino <arnour@digirati.com.br>, Richard Brandao <brandao@richard.web.br.com>
 */
abstract class Validation {

  /**
  * Execução da validação via EXP
  *
  * @param string $StPattern
  * @param string $StData
  * @return bool
  *
  * @author Dimitri Lameri <Dimitri@Digirati.com.br>
  */
    protected function doValidation($StPattern, $StData) {
        return preg_match($StPattern,$StData) ? true : false;
    }

  /**
  * Validacao de email
  *
  * @param string $StEmail
  * @return bool
  *
  * @author Dimitri Lameri <Dimitri@Digirati.com.br>
  */
  public static function Email($StData) {
    $ExpReg = '/^[\w\.\-]+[@][\w\.\-]+\.(?i)[a-z\_\-]{2,4}$/';
    return self::doValidation($ExpReg,$StData);
  }

  /**
  * Validacao de Data
  *
  * @param string $StData
  * @param string $StFormat - Formato da data
  * @return bool;
  *
  * @author Dimitri Lameri <Dimitri@Digirati.com.br>
  */
  public static function Date($StData, $StFormat = 'd/m/y') {
    $StSeparator = '(\/|\-)';
    $StDay = '([0-2][0-9]|3[0-1])';
    $StMonth = '(0[1-9]|1[0-2])';
    $StYear = '([0-9]{4})';

    $ExpReg = preg_replace( '/\/|\-/', $StSeparator, $StFormat );
    $ExpReg = preg_replace( '/[d]/i', $StDay,  $ExpReg);
    $ExpReg = preg_replace( '/[m]/i', $StMonth, $ExpReg);
    $ExpReg = preg_replace( '/[y]/i', $StYear,  $ExpReg);

    $ExpReg = '/^' . $ExpReg . '$/';

    return self::doValidation($ExpReg,$StData);
  }
  /**
  * Valida um dominio/Url
  *
  * @param string $StData
  * @return bool
  *
  * @author Dimitri Lameri <Dimitri@Digirati.com.br>
  */
  public static function Dormain($StData) {
          $ExpReg = '%^(http\:\/\/)[\w\.\-]+\.(?i)[a-z\_\-]{2,4}$%';
          return self::doValidation($ExpReg,$StData);
  }


  public static function Cep($StData) {
      $ExpReg = '%^[0-9]{5}-[0-9]{3}$%';
      return self::doValidation($ExpReg,$StData);
  }

  public static function Number($StData) {
      $ExpReg = '%^[0-9]{1,}$%';
      return self::doValidation($ExpReg,$StData);
  }

  public static function Phone($StData, $BoDdd = false) {
      $ExpReg = (!$BoDdd) ? '%^[0-9]{4}\-[0-9]{4}$%' : '%^\([0-9]{2}\) [0-9]{4}\-[0-9]{4}$%';
      return self::doValidation($ExpReg, $StData);
  }

  /**
   * Algoritmo com base nas regras do Ministerio da Fazenda para realizar a
   * validacao de um cpf. Consiste na verificacao dos digitos verificadores
   * e retorna true se o cpf passado em StData for valido.
   *
   * @param  string     $StData     Cpf que sera validado, pode estar em qualquer formato.
   * @return bool
   * @since  2011-08-08
   *
   * @author    Richard Brandao <richard@hostnet.com.br>
   */
  public static function Cpf($StData) {
      $StData = preg_replace('%[\.|\-]%', '', $StData);

      $len = strlen($StData);
      if( $len != 11 ) { return false; }

      $ItVal = preg_match( '%^[0-9]{11}$%', $StData );
      if( $ItVal == 0 ) { return false; }

      if( $StData == '00000000000' || $StData == '11111111111' || $StData == '22222222222' || $StData == '33333333333' ||
          $StData == '44444444444' || $StData == '55555555555' || $StData == '66666666666' || $StData == '66666666666' ||
          $StData == '77777777777' || $StData == '88888888888' || $StData == '99999999999') {
          return false;
      }

      $ArCpf = array();
      $ItDigito1 = 0;
      $ArValidacao1 = array( 10,9,8,7,6,5,4,3,2 );
      for( $i = 0, $length = count($ArValidacao1); $i < $length; $i++ ) {
          $ArCpf[$i] = $StData[$i];
          $ItDigito1 += ($ArCpf[$i] * $ArValidacao1[$i]);
      }
      $ArCpf[9] = (($ItDigito1%11) >= 2) ? 11-round($ItDigito1%11): 0;

      $ItDigito2 = 0;
      $ArValidacao2 = array(11,10,9,8,7,6,5,4,3,2);
      for( $i = 0, $length = count($ArValidacao2); $i < $length; $i++ ) {
          $ItDigito2 += ($ArCpf[$i] * $ArValidacao2[$i]);
      }
      $ArCpf[10] = (($ItDigito2%11) >= 2) ? 11-round($ItDigito2%11) : 0;

      return ( $ArCpf[9] == $StData[9] && $ArCpf[10] == $StData[10] ) ? true : false;
  }
  /**
   * Algoritmo com base nas regras do Ministerio da Fazenda para realizar a
   * validacao de um cnpj. Consiste na verificacao dos digitos verificadores
   * e retorna true se o cnpj passado em StData for valido.
   *
   * @param  string     $StData     Cnpj que sera validado, pode estar em qualquer formato.
   * @return bool
   * @since  2011-08-08
   *
   * @author    Richard Brandao <richard@hostnet.com.br>
   */
  public static function Cnpj($StData) {
      $StData = preg_replace('%[\.|\-|\/]%', '', $StData);

      $len = strlen($StData);
      if( $len != 14 ) {
          return false;
      }

      $ItVal = preg_match('%^[0-9]{14}$%', $StData, $matches);
      if( $ItVal == 0 ) { return false; }

      $ArCnpj = array();
      $ItDigito1 = 0;
      $ArValidacaoDigito1 = array( 5,4,3,2,9,8,7,6,5,4,3,2 );
      for( $i = 0, $length = count($ArValidacaoDigito1); $i < $length; $i++ ) {
          $ArCnpj[$i] = $StData[$i];
          $ItDigito1 += $ArValidacaoDigito1[$i] * $ArCnpj[$i];
      }
      $ArCnpj[12] = ( ($ItDigito1%11) >= 2 ) ? 11 - ($ItDigito1%11) : 0 ;

      $ItDigito2 = 0;
      $ArValidacaoDigito2 = array( 6,5,4,3,2,9,8,7,6,5,4,3,2 );
      for( $i = 0, $length = count($ArValidacaoDigito2); $i < $length; $i++ ) {
          $ItDigito2 += $ArValidacaoDigito2[$i] * $ArCnpj[$i];
      }
      $ArCnpj[13] = (($ItDigito2%11) >= 2) ? 11 - ($ItDigito2%11) : 0;

      return ( $ArCnpj[12] == $StData[12] && $ArCnpj[13] == $StData[13] ) ? true : false;
  }

}


?>